All case studies should include a disclaimer about the project, licensing info, and proper citation. See below for examples:

Disclaimer: The purpose of the Open Case Studies project is to demonstrate the use of various data science methods, tools, and software in the context of messy, real-world data. A given case study does not cover all aspects of the research process, is not claiming to be the most appropriate way to analyze a given data set, and should not be used in the context of making policy decisions without external consultation from scientific experts.

This work is licensed under the Creative Commons Attribution-NonCommercial 3.0 (CC BY-NC 3.0) United States License.

To cite this case study please use:

Wright, Carrie and Ontiveros, Michael and Jager, Leah and Taub, Margaret and Hicks, Stephanie. (2020). https://github.com/opencasestudies/ocs-bp-co2-emissions. Exploring CO2 emissions across time (Version v1.0.0).

In this space you should provide an open access link to the case study source files. This is necessary for users to get access to case study data, at a minimum. See the following example from the CO2 Emissions case study:

To access the GitHub repository for this case study see here: https://github.com//opencasestudies/ocs-bp-co2-emissions. This case study is part of a series of public health case studies for the Bloomberg American Health Initiative.

Motivation


Begin the case study by describing what will be analyzed and why.

You may use headers and sub-headers like such:

Content Header


Content content

content header additional level


Attach quotes:

Content for quotes

Attach images:

for large images from the web… might do this instead:

… and provide a link to the image source:

[source]

Use the following syntax scheme for stylizing text:

To underline something:
Bold
Italics
underline and bold
underline and bold and italics

Create a List:
1) make sure there are two spaces
2) after each item to create new line

Provide references for your images/content:

Yanosky, J. D. et al. Spatio-temporal modeling of particulate air pollution in the conterminous United States using geographic and meteorological predictors. Environ Health 13, 63 (2014).

Main Questions


List inside the main question block the main questions that we seek to answer with the case study analysis:

Our main question:

  1. Question 1
  2. Question 2 etc. (You may have more than 2)

Learning Objectives


In this section, discuss the data science and statistical skills, methods, and concepts that will be covered by this case study. An example from the CO2 emissions case study is provided here:

In this case study, we will explore CO2 emission data from around the world. We will also focus on the US specifically to evaluate patterns of temperatures and natural disaster activity.

This case study will particularly focus on how to use different datasets that span different ranges of time, as well as how to create visualizations of patterns over time. We will especially focus on using packages and functions from the tidyverse, such as dplyr, tidyr, and ggplot2.

The tidyverse is a library of packages created by RStudio. While some students may be familiar with previous R programming packages, these packages make data science in R especially legible and intuitive.

The skills, methods, and concepts that students will be familiar with by the end of this case study are:

Data Science Learning Objectives:

  1. Importing data from various types of Excel files and CSV files
  2. Apply action verbs in dplyr for data wrangling
  3. How to pivot between “long” and “wide” datasets
  4. Joining together multiple datasets using dplyr
  5. How to create effective longitudinal data visualizations with ggplot2
  6. How to add text, color, and labels to ggplot2 plots
  7. How to create faceted ggplot2 plots

Statistical Learning Objectives:

  1. Introduction to correlation coefficient as a summary statistic
  2. Relationship between correlation and linear regression
  3. Correlation is not causation


After discussing the learning objectives, load all the packages used in the case study analysis in the code chunk below:

We will begin by loading the packages that we will need:

library(here)
library(readr)
library(dplyr)

Provide a link to the source and briefly explain its use for each package in the following table:

Package Use
here to easily load and save data
readr to import the CSV file data

The first time we use a function, we will use the :: to indicate which package we are using. Unless we have overlapping function names, this is not necessary, but we will include it here to be informative about where the functions we will use come from.

Note: Using the method described above is preferred, but not necessary. (avocado is this ok to say?)

Context


Provide some more details and background on the case study topic and its relation to public health/the world.

Limitations


Describe any limitations that exist in this analysis whether it be due to the data itself, methods used, nature of the topic, etc.

There are some important considerations regarding this data analysis to keep in mind:

  1. Limitation 1

  2. Limitaiton 2

What are the data?


Describe the data to be analyzed and where it came from in this section.

If you want to make a table about variable info, use the following table template:

Variable Details
variable1 Variable info
– more details
– more detials
Example: Content content
variable2 Variable info
– more details
– more detials
Example: Content content

Data Import


Describe how to import your case study data files into R: (avocado or python?)

Within your case study project folder, put the data files as they came from the source into a ‘data/raw/’ subfolder and use the here package. See the following example:

pm <-readr::read_csv(here("data", "raw", "pm25_data.csv"))

At the end of the data import section, save the imported data as .rda files to allow users to stop and pick up where they left off:

save(pm, file = here::here("data", "imported", "pm25_data_imported.rda"))

Data Exploration and Wrangling


At the beginning of the section, include the following message:

If you have been following along but stopped, we could load our imported data like so:

load(here::here("data", "imported", "pm25_data_imported.rda"))

Also provide guidance for users who may have skipped the previous section, see the following example:


If you skipped the data import section click here.

An RDA version (stands for R data) of the data can be found here or slightly more directly here. Download this file and then place it in your current working directory within a subdirectory called “imported” within a directory called “data” to use the following code. We used an RStudio project and the here package to navigate to the file more easily.

load(here::here("data", "imported", "co2_data_imported.rda"))

Use this section to walk through any exploration of the data conducted pre-analysis. Then, explain step-by-step the data wrangling process used to prepare the data for analysis. Note that not all case studies include a data exploration. Data exploration and wrangling may also be split into two sections.

We will also use the %>% pipe which can be used to define the input for later sequential steps. This will make more sense when we have multiple sequential steps using the same data object. To use the pipe notation we need to install and load dplyr as well. (avocado do we want to keep this line above in the template?)

Can include DT tables too:

library(DT)
DT::datatable(iris)

(note that you can`t use these inside a click expand details section.)

Scrollable content:

# Scroll through the output!
pm %>% 
  distinct(state) %>%
  print(n = 1e3)
# A tibble: 49 x 1
   state               
   <chr>               
 1 Alabama             
 2 Arizona             
 3 Arkansas            
 4 California          
 5 Colorado            
 6 Connecticut         
 7 Delaware            
 8 District Of Columbia
 9 Florida             
10 Georgia             
11 Idaho               
12 Illinois            
13 Indiana             
14 Iowa                
15 Kansas              
16 Kentucky            
17 Louisiana           
18 Maine               
19 Maryland            
20 Massachusetts       
21 Michigan            
22 Minnesota           
23 Mississippi         
24 Missouri            
25 Montana             
26 Nebraska            
27 Nevada              
28 New Hampshire       
29 New Jersey          
30 New Mexico          
31 New York            
32 North Carolina      
33 North Dakota        
34 Ohio                
35 Oklahoma            
36 Oregon              
37 Pennsylvania        
38 Rhode Island        
39 South Carolina      
40 South Dakota        
41 Tennessee           
42 Texas               
43 Utah                
44 Vermont             
45 Virginia            
46 Washington          
47 West Virginia       
48 Wisconsin           
49 Wyoming             

To make click expand section use:

Click here to see more info

text text

Note!!! You cannot use scroll features inside detail sections unless it is the last header section! Otherwise it will cause the other headers to be missing and other issues.

You can still do this if you leave an open details section like this and then have a section header at the same level as this section:

Click here to see more info

text text

Scrollable content:

# Scroll through the output!
pm %>% 
  distinct(state) %>%
  print(n = 1e3)
# A tibble: 49 x 1
   state               
   <chr>               
 1 Alabama             
 2 Arizona             
 3 Arkansas            
 4 California          
 5 Colorado            
 6 Connecticut         
 7 Delaware            
 8 District Of Columbia
 9 Florida             
10 Georgia             
11 Idaho               
12 Illinois            
13 Indiana             
14 Iowa                
15 Kansas              
16 Kentucky            
17 Louisiana           
18 Maine               
19 Maryland            
20 Massachusetts       
21 Michigan            
22 Minnesota           
23 Mississippi         
24 Missouri            
25 Montana             
26 Nebraska            
27 Nevada              
28 New Hampshire       
29 New Jersey          
30 New Mexico          
31 New York            
32 North Carolina      
33 North Dakota        
34 Ohio                
35 Oklahoma            
36 Oregon              
37 Pennsylvania        
38 Rhode Island        
39 South Carolina      
40 South Dakota        
41 Tennessee           
42 Texas               
43 Utah                
44 Vermont             
45 Virginia            
46 Washington          
47 West Virginia       
48 Wisconsin           
49 Wyoming             

At the end of this section, include the following:

To allow users to skip import and wrangling we will save the data as an RDA file as well as a CSV file as this is often useful to send our data to collaborators. We will save this in a “wrangled” subdirectory of our “data” directory of our working directory.

save(pm, file = here::here("data", "wrangled", "wrangled_data.rda")) 
readr::write_csv(pm, path = here::here("data","wrangled", "wrangled_data.csv"))

Replace pm with the name of the data object created at the end of data wrangling.

Data Visualization


At the beginning of the section, include the following message:

If you have been following along but stopped, we could load our wrangled data like so:

load(here::here("data", "wrangled", "wrangled_data.rda"))

Also provide guidance for users who may have skipped the previous section, see the following example:


If you skipped the data import section click here.

An RDA file (stands for R data) of the data can be found here or slightly more directly here. Download this file and then place it in your current working directory within a subdirectory called “wrangled” within a subdirectory called “data” to use the following code. We used an RStudio project and the here package to navigate to the file more easily.

load(here::here("data", "wrangled", "wrangled_data.rda"))

Use this section to walk through step by step how the wrangled data was visualized. Explain how these visualizations improve understanding and help extract insights.

If any further wrangling was conducted in this section, please save the most recent version of the data similar to previous sections.

Data Analysis


At the beginning of the section, include the following message:

If you have been following along but stopped, we could load our wrangled data like so:

load(here::here("data", "wrangled", "wrangled_data.rda"))

Also provide guidance for users who may have skipped the previous section, see the following example:


If you skipped the data import section click here.

An RDA file (stands for R data) of the data can be found here or slightly more directly here. Download this file and then place it in your current working directory within a subdirectory called “wrangled” within a subdirectory called “data” to use the following code. We used an RStudio project and the here package to navigate to the file more easily.

load(here::here("data", "wrangled", "wrangled_data.rda"))

Use this section to walk through the methods and code used in the data analysis step-by-step. Explain how this analysis helps answer the main questions posed earlier in the case study.

content header


content header additional level


Summary


Synopsis


Briefly recap everything that was covered in the case study from the motivation to data analysis. Highlight the conclusions made and suggest any limitations or future work to be done.

Summary Plot


Construct a plot here that summarizes the conclusions found in the data, if applicable.

Suggested Homework


Suggest extra exercises using this data for students to practice the skills used in the case study.

Examples from CO2 case study:

Ask students to create a plot with labels showing the countries with the lowest CO2 emission levels.

Ask students to plot CO2 emissions and other variables (e.g. energy use) on a scatter plot, calculate the Pearson’s correlation coefficient, and discuss results.

Additional Information


Use this section to provide any additional information or resources on the topics and methods covered in the case study.

Session Info


devtools::session_info()
- Session info ---------------------------------------------------------------
 setting  value
 version  R version 4.1.2 (2021-11-01)
 os       Windows 10 x64 (build 19044)
 system   x86_64, mingw32
 ui       RTerm
 language (EN)
 collate  English_United States.1252
 ctype    English_United States.1252
 tz       America/Los_Angeles
 date     2022-02-24
 pandoc   2.11.4 @ C:/Program Files/RStudio/bin/pandoc/ (via rmarkdown)

- Packages -------------------------------------------------------------------
 package     * version date (UTC) lib source
 assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.1.0)
 bit           4.0.4   2020-08-04 [1] CRAN (R 4.1.0)
 bit64         4.0.5   2020-08-30 [1] CRAN (R 4.1.0)
 brio          1.1.3   2021-11-30 [1] CRAN (R 4.1.2)
 bslib         0.3.1   2021-10-06 [1] CRAN (R 4.1.2)
 cachem        1.0.6   2021-08-19 [1] CRAN (R 4.1.1)
 callr         3.7.0   2021-04-20 [1] CRAN (R 4.1.0)
 cli           3.2.0   2022-02-14 [1] CRAN (R 4.1.2)
 crayon        1.5.0   2022-02-14 [1] CRAN (R 4.1.2)
 crosstalk     1.2.0   2021-11-04 [1] CRAN (R 4.1.2)
 DBI           1.1.2   2021-12-20 [1] CRAN (R 4.1.2)
 desc          1.4.0   2021-09-28 [1] CRAN (R 4.1.2)
 devtools      2.4.3   2021-11-30 [1] CRAN (R 4.1.2)
 digest        0.6.29  2021-12-01 [1] CRAN (R 4.1.2)
 dplyr       * 1.0.7   2021-06-18 [1] CRAN (R 4.1.0)
 DT          * 0.20    2021-11-15 [1] CRAN (R 4.1.2)
 ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.1.0)
 evaluate      0.15    2022-02-18 [1] CRAN (R 4.1.2)
 fansi         1.0.2   2022-01-14 [1] CRAN (R 4.1.2)
 fastmap       1.1.0   2021-01-25 [1] CRAN (R 4.1.0)
 fs            1.5.2   2021-12-08 [1] CRAN (R 4.1.2)
 generics      0.1.1   2021-10-25 [1] CRAN (R 4.1.2)
 glue          1.6.1   2022-01-22 [1] CRAN (R 4.1.2)
 here        * 1.0.1   2020-12-13 [1] CRAN (R 4.1.1)
 highr         0.9     2021-04-16 [1] CRAN (R 4.1.0)
 hms           1.1.1   2021-09-26 [1] CRAN (R 4.1.2)
 htmltools     0.5.2   2021-08-25 [1] CRAN (R 4.1.1)
 htmlwidgets   1.5.4   2021-09-08 [1] CRAN (R 4.1.1)
 jquerylib     0.1.4   2021-04-26 [1] CRAN (R 4.1.1)
 jsonlite      1.8.0   2022-02-22 [1] CRAN (R 4.1.2)
 knitr       * 1.37    2021-12-16 [1] CRAN (R 4.1.2)
 lifecycle     1.0.1   2021-09-24 [1] CRAN (R 4.1.2)
 magrittr      2.0.2   2022-01-26 [1] CRAN (R 4.1.2)
 memoise       2.0.1   2021-11-26 [1] CRAN (R 4.1.2)
 pillar        1.7.0   2022-02-01 [1] CRAN (R 4.1.2)
 pkgbuild      1.3.1   2021-12-20 [1] CRAN (R 4.1.2)
 pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.1.0)
 pkgload       1.2.4   2021-11-30 [1] CRAN (R 4.1.2)
 prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.1.0)
 processx      3.5.2   2021-04-30 [1] CRAN (R 4.1.0)
 ps            1.6.0   2021-02-28 [1] CRAN (R 4.1.0)
 purrr         0.3.4   2020-04-17 [1] CRAN (R 4.1.0)
 R6            2.5.1   2021-08-19 [1] CRAN (R 4.1.1)
 readr       * 2.1.1   2021-11-30 [1] CRAN (R 4.1.2)
 remotes       2.4.2   2021-11-30 [1] CRAN (R 4.1.2)
 rlang         1.0.1   2022-02-03 [1] CRAN (R 4.1.2)
 rmarkdown     2.11    2021-09-14 [1] CRAN (R 4.1.2)
 rprojroot     2.0.2   2020-11-15 [1] CRAN (R 4.1.0)
 rstudioapi    0.13    2020-11-12 [1] CRAN (R 4.1.0)
 sass          0.4.0   2021-05-12 [1] CRAN (R 4.1.1)
 sessioninfo   1.2.2   2021-12-06 [1] CRAN (R 4.1.2)
 stringi       1.7.6   2021-11-29 [1] CRAN (R 4.1.2)
 stringr       1.4.0   2019-02-10 [1] CRAN (R 4.1.0)
 testthat      3.1.2   2022-01-20 [1] CRAN (R 4.1.2)
 tibble        3.1.6   2021-11-07 [1] CRAN (R 4.1.2)
 tidyselect    1.1.1   2021-04-30 [1] CRAN (R 4.1.0)
 tzdb          0.2.0   2021-10-27 [1] CRAN (R 4.1.2)
 usethis       2.1.5   2021-12-09 [1] CRAN (R 4.1.2)
 utf8          1.2.2   2021-07-24 [1] CRAN (R 4.1.0)
 vctrs         0.3.8   2021-04-29 [1] CRAN (R 4.1.0)
 vroom         1.5.7   2021-11-30 [1] CRAN (R 4.1.2)
 withr         2.4.3   2021-11-30 [1] CRAN (R 4.1.2)
 xfun          0.29    2021-12-14 [1] CRAN (R 4.1.2)
 yaml          2.3.5   2022-02-21 [1] CRAN (R 4.1.2)

 [1] C:/Users/Michael/Documents/R/win-library/4.1
 [2] C:/Program Files/R/R-4.1.2/library

------------------------------------------------------------------------------

Acknowledgments


LS0tDQp0aXRsZTogIk9wZW4gQ2FzZSBTdHVkaWVzIDogVGl0bGUgIg0KY3NzOiBzdHlsZS5jc3MNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBzZWxmX2NvbnRhaW5lZDogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICB0aGVtZTogY29zbW8NCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQoNCi0tLQ0KPHN0eWxlPg0KI1RPQyB7DQogIGJhY2tncm91bmQ6IHVybCgiaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvL2ltZy9pY29uLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIHBhZGRpbmctdG9wOiAyNDBweCAhaW1wb3J0YW50Ow0KICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KfQ0KPC9zdHlsZT4NCg0KDQoNCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChpbmNsdWRlID0gVFJVRSwgY29tbWVudCA9IE5BLCBlY2hvID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgY2FjaGUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gPSAiY2VudGVyIiwgb3V0LndpZHRoID0gJzkwJScpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KGtuaXRyKQ0KYGBgDQoNCg0KIyMjIyB7Lm91dGxpbmUgfQ0KYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoID0gIjgwMCBweCJ9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAibWFpbnBsb3QucG5nIikpDQpgYGANCg0KIyMjIw0KDQpBbGwgY2FzZSBzdHVkaWVzIHNob3VsZCBpbmNsdWRlIGEgZGlzY2xhaW1lciBhYm91dCB0aGUgcHJvamVjdCwgbGljZW5zaW5nIGluZm8sIGFuZCBwcm9wZXIgY2l0YXRpb24uIFNlZSBiZWxvdyBmb3IgZXhhbXBsZXM6DQoNCiMjIyMgey5kaXNjbGFpbWVyX2Jsb2NrfQ0KDQoqKkRpc2NsYWltZXIqKjogVGhlIHB1cnBvc2Ugb2YgdGhlIFtPcGVuIENhc2UgU3R1ZGllc10oaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvKXt0YXJnZXQ9Il9ibGFuayJ9IHByb2plY3QgaXMgKip0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHZhcmlvdXMgZGF0YSBzY2llbmNlIG1ldGhvZHMsIHRvb2xzLCBhbmQgc29mdHdhcmUgaW4gdGhlIGNvbnRleHQgb2YgbWVzc3ksIHJlYWwtd29ybGQgZGF0YSoqLiBBIGdpdmVuIGNhc2Ugc3R1ZHkgZG9lcyBub3QgY292ZXIgYWxsIGFzcGVjdHMgb2YgdGhlIHJlc2VhcmNoIHByb2Nlc3MsIGlzIG5vdCBjbGFpbWluZyB0byBiZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSB3YXkgdG8gYW5hbHl6ZSBhIGdpdmVuIGRhdGEgc2V0LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjb250ZXh0IG9mIG1ha2luZyBwb2xpY3kgZGVjaXNpb25zIHdpdGhvdXQgZXh0ZXJuYWwgY29uc3VsdGF0aW9uIGZyb20gc2NpZW50aWZpYyBleHBlcnRzLiANCg0KIyMjIw0KDQojIyMjIHsubGljZW5zZV9ibG9ja30NCg0KVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwgMy4wIFsoQ0MgQlktTkMgMy4wKV0oaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLzMuMC91cy8pe3RhcmdldD0iX2JsYW5rIn0gIFVuaXRlZCBTdGF0ZXMgTGljZW5zZS4NCg0KIyMjIw0KDQojIyMjIHsucmVmZXJlbmNlX2Jsb2NrfQ0KDQpUbyBjaXRlIHRoaXMgY2FzZSBzdHVkeSBwbGVhc2UgdXNlOg0KDQpXcmlnaHQsIENhcnJpZSBhbmQgT250aXZlcm9zLCBNaWNoYWVsIGFuZCBKYWdlciwgTGVhaCBhbmQgVGF1YiwgTWFyZ2FyZXQgYW5kIEhpY2tzLCBTdGVwaGFuaWUuICgyMDIwKS4gaHR0cHM6Ly9naXRodWIuY29tL29wZW5jYXNlc3R1ZGllcy9vY3MtYnAtY28yLWVtaXNzaW9ucy4gRXhwbG9yaW5nIENPMiBlbWlzc2lvbnMgYWNyb3NzIHRpbWUgKFZlcnNpb24gdjEuMC4wKS4NCg0KIyMjIw0KDQpJbiB0aGlzIHNwYWNlIHlvdSBzaG91bGQgcHJvdmlkZSBhbiBvcGVuIGFjY2VzcyBsaW5rIHRvIHRoZSBjYXNlIHN0dWR5IHNvdXJjZSBmaWxlcy4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHVzZXJzIHRvIGdldCBhY2Nlc3MgdG8gY2FzZSBzdHVkeSBkYXRhLCBhdCBhIG1pbmltdW0uIFNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGUgZnJvbSB0aGUgQ08yIEVtaXNzaW9ucyBjYXNlIHN0dWR5Og0KDQpUbyBhY2Nlc3MgdGhlIEdpdEh1YiByZXBvc2l0b3J5IGZvciB0aGlzIGNhc2Ugc3R1ZHkgc2VlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8vb3BlbmNhc2VzdHVkaWVzL29jcy1icC1jbzItZW1pc3Npb25zLg0KVGhpcyBjYXNlIHN0dWR5IGlzIHBhcnQgb2YgYSBzZXJpZXMgb2YgcHVibGljIGhlYWx0aCBjYXNlIHN0dWRpZXMgZm9yIHRoZSBbQmxvb21iZXJnIEFtZXJpY2FuIEhlYWx0aCBJbml0aWF0aXZlXShodHRwczovL2FtZXJpY2FuaGVhbHRoLmpodS5lZHUvb3Blbi1jYXNlLXN0dWRpZXMpLg0KDQojICoqTW90aXZhdGlvbioqDQoqKiogDQpCZWdpbiB0aGUgY2FzZSBzdHVkeSBieSBkZXNjcmliaW5nIHdoYXQgd2lsbCBiZSBhbmFseXplZCBhbmQgd2h5LiAgDQoNCllvdSBtYXkgdXNlIGhlYWRlcnMgYW5kIHN1Yi1oZWFkZXJzIGxpa2Ugc3VjaDoNCg0KIyMgKipDb250ZW50IEhlYWRlcioqDQoqKiogDQoNCkNvbnRlbnQgY29udGVudA0KDQoNCiMjIyAqKmNvbnRlbnQgaGVhZGVyIGFkZGl0aW9uYWwgbGV2ZWwqKg0KKioqDQpBdHRhY2ggcXVvdGVzOg0KDQo+IENvbnRlbnQgZm9yIHF1b3Rlcw0KDQpBdHRhY2ggaW1hZ2VzOg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjgwMHB4In0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsImNvbnRlbnRfaW1hZ2UucG5nIikpDQpgYGANCmZvciBsYXJnZSBpbWFnZXMgZnJvbSB0aGUgd2ViLi4uIG1pZ2h0IGRvIHRoaXMgaW5zdGVhZDoNCg0KPHAgYWxpZ249ImNlbnRlciI+DQogIDxpbWcgd2lkdGg9IjUwMCIgc3JjPSJodHRwczovL3d3dy5mcm9udGllcnNpbi5vcmcvZmlsZXMvQXJ0aWNsZXMvNTA1NTcwL2ZwdWJoLTA4LTAwMDE0LUhUTUwvaW1hZ2VfbS9mcHViaC0wOC0wMDAxNC10MDAyLmpwZyI+DQo8L3A+DQoNCi4uLiBhbmQgcHJvdmlkZSBhIGxpbmsgdG8gdGhlIGltYWdlIHNvdXJjZToNCg0KIyMjIyMgW1tzb3VyY2VdKGh0dHBzOi8vd3d3LmZyb250aWVyc2luLm9yZy9hcnRpY2xlcy8xMC4zMzg5L2ZwdWJoLjIwMjAuMDAwMTQvZnVsbCldDQoNClVzZSB0aGUgZm9sbG93aW5nIHN5bnRheCBzY2hlbWUgZm9yIHN0eWxpemluZyB0ZXh0Og0KDQo8dT5UbyB1bmRlcmxpbmUgc29tZXRoaW5nOjwvdT4gIA0KKipCb2xkKiogIA0KKkl0YWxpY3MqICANCjx1PioqdW5kZXJsaW5lIGFuZCBib2xkKiogPC91PiAgDQo8dT4qKip1bmRlcmxpbmUgYW5kIGJvbGQgYW5kIGl0YWxpY3MqKiogPC91PiAgDQoNCkNyZWF0ZSBhIExpc3Q6ICANCjEpIG1ha2Ugc3VyZSB0aGVyZSBhcmUgdHdvIHNwYWNlcyAgICANCjIpIGFmdGVyIGVhY2ggaXRlbSB0byBjcmVhdGUgbmV3IGxpbmUgIA0KDQpQcm92aWRlIHJlZmVyZW5jZXMgZm9yIHlvdXIgaW1hZ2VzL2NvbnRlbnQ6IA0KDQojIyMjIHsucmVmZXJlbmNlX2Jsb2NrfQ0KDQpZYW5vc2t5LCBKLiBELiBldCBhbC4gU3BhdGlvLXRlbXBvcmFsIG1vZGVsaW5nIG9mIHBhcnRpY3VsYXRlIGFpciBwb2xsdXRpb24gaW4gdGhlIGNvbnRlcm1pbm91cyBVbml0ZWQgU3RhdGVzIHVzaW5nIGdlb2dyYXBoaWMgYW5kIG1ldGVvcm9sb2dpY2FsIHByZWRpY3RvcnMuICpFbnZpcm9uIEhlYWx0aCogMTMsIDYzICgyMDE0KS4NCg0KIyMjIw0KDQoNCiMgKipNYWluIFF1ZXN0aW9ucyoqDQoqKiogDQpMaXN0IGluc2lkZSB0aGUgbWFpbiBxdWVzdGlvbiBibG9jayB0aGUgbWFpbiBxdWVzdGlvbnMgdGhhdCB3ZSBzZWVrIHRvIGFuc3dlciB3aXRoIHRoZSBjYXNlIHN0dWR5IGFuYWx5c2lzOg0KDQojIyMjIHsubWFpbl9xdWVzdGlvbl9ibG9ja30NCjxiPjx1PiBPdXIgbWFpbiBxdWVzdGlvbjogPC91PjwvYj4NCg0KMSkgUXVlc3Rpb24gMSAgDQoyKSBRdWVzdGlvbiAyIGV0Yy4gKFlvdSBtYXkgaGF2ZSBtb3JlIHRoYW4gMikNCg0KIyMjIw0KDQojICoqTGVhcm5pbmcgT2JqZWN0aXZlcyoqIA0KKioqIA0KSW4gdGhpcyBzZWN0aW9uLCBkaXNjdXNzIHRoZSBkYXRhIHNjaWVuY2UgYW5kIHN0YXRpc3RpY2FsIHNraWxscywgbWV0aG9kcywgYW5kIGNvbmNlcHRzIHRoYXQgd2lsbCBiZSBjb3ZlcmVkIGJ5IHRoaXMgY2FzZSBzdHVkeS4gQW4gZXhhbXBsZSBmcm9tIHRoZSBDTzIgZW1pc3Npb25zIGNhc2Ugc3R1ZHkgaXMgcHJvdmlkZWQgaGVyZTogDQoNCkluIHRoaXMgY2FzZSBzdHVkeSwgd2Ugd2lsbCBleHBsb3JlIENPMiBlbWlzc2lvbiBkYXRhIGZyb20gYXJvdW5kIHRoZSB3b3JsZC4gDQpXZSB3aWxsIGFsc28gZm9jdXMgb24gdGhlIFVTIHNwZWNpZmljYWxseSB0byBldmFsdWF0ZSBwYXR0ZXJucyBvZiB0ZW1wZXJhdHVyZXMgYW5kIG5hdHVyYWwgZGlzYXN0ZXIgYWN0aXZpdHkuIA0KDQpUaGlzIGNhc2Ugc3R1ZHkgd2lsbCBwYXJ0aWN1bGFybHkgZm9jdXMgb24gaG93IHRvIHVzZSBkaWZmZXJlbnQgZGF0YXNldHMgdGhhdCBzcGFuIGRpZmZlcmVudCByYW5nZXMgb2YgdGltZSwgYXMgd2VsbCBhcyBob3cgdG8gY3JlYXRlIHZpc3VhbGl6YXRpb25zIG9mIHBhdHRlcm5zIG92ZXIgdGltZS4gDQpXZSB3aWxsIGVzcGVjaWFsbHkgZm9jdXMgb24gdXNpbmcgcGFja2FnZXMgYW5kIGZ1bmN0aW9ucyBmcm9tIHRoZSBbYHRpZHl2ZXJzZWBdKGh0dHBzOi8vd3d3LnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9LCBzdWNoIGFzIGBkcGx5cmAsIGB0aWR5cmAsIGFuZCBgZ2dwbG90MmAuIA0KDQpUaGUgdGlkeXZlcnNlIGlzIGEgbGlicmFyeSBvZiBwYWNrYWdlcyBjcmVhdGVkIGJ5IFJTdHVkaW8uIA0KV2hpbGUgc29tZSBzdHVkZW50cyBtYXkgYmUgZmFtaWxpYXIgd2l0aCBwcmV2aW91cyBSIHByb2dyYW1taW5nIHBhY2thZ2VzLCB0aGVzZSBwYWNrYWdlcyBtYWtlIGRhdGEgc2NpZW5jZSBpbiBSIGVzcGVjaWFsbHkgbGVnaWJsZSBhbmQgaW50dWl0aXZlLg0KDQpUaGUgc2tpbGxzLCBtZXRob2RzLCBhbmQgY29uY2VwdHMgdGhhdCBzdHVkZW50cyB3aWxsIGJlIGZhbWlsaWFyIHdpdGggYnkgdGhlIGVuZCBvZiB0aGlzIGNhc2Ugc3R1ZHkgYXJlOg0KDQo8dT4qKkRhdGEgU2NpZW5jZSBMZWFybmluZyBPYmplY3RpdmVzOioqPC91PiAgDQoNCjEuIEltcG9ydGluZyBkYXRhIGZyb20gdmFyaW91cyB0eXBlcyBvZiBFeGNlbCBmaWxlcyBhbmQgQ1NWIGZpbGVzDQoyLiBBcHBseSBhY3Rpb24gdmVyYnMgaW4gYGRwbHlyYCBmb3IgZGF0YSB3cmFuZ2xpbmcNCjMuIEhvdyB0byBwaXZvdCBiZXR3ZWVuICJsb25nIiBhbmQgIndpZGUiIGRhdGFzZXRzDQo0LiBKb2luaW5nIHRvZ2V0aGVyIG11bHRpcGxlIGRhdGFzZXRzIHVzaW5nIGBkcGx5cmANCjUuIEhvdyB0byBjcmVhdGUgZWZmZWN0aXZlIGxvbmdpdHVkaW5hbCBkYXRhIHZpc3VhbGl6YXRpb25zIHdpdGggYGdncGxvdDJgDQo2LiBIb3cgdG8gYWRkIHRleHQsIGNvbG9yLCBhbmQgbGFiZWxzIHRvIGBnZ3Bsb3QyYCBwbG90cw0KNy4gSG93IHRvIGNyZWF0ZSBmYWNldGVkIGBnZ3Bsb3QyYCBwbG90cw0KDQo8dT4qKlN0YXRpc3RpY2FsIExlYXJuaW5nIE9iamVjdGl2ZXM6Kio8L3U+ICANCg0KMS4gSW50cm9kdWN0aW9uIHRvIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGFzIGEgc3VtbWFyeSBzdGF0aXN0aWMNCjIuIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvcnJlbGF0aW9uIGFuZCBsaW5lYXIgcmVncmVzc2lvbg0KMy4gQ29ycmVsYXRpb24gaXMgbm90IGNhdXNhdGlvbg0KDQpgYGB7ciwgb3V0LndpZHRoID0gIjIwJSIsIGVjaG8gPSBGQUxTRSwgZmlnLmFsaWduID0gImNlbnRlciJ9DQppbmNsdWRlX2dyYXBoaWNzKCJodHRwczovL3RpZHl2ZXJzZS50aWR5dmVyc2Uub3JnL2xvZ28ucG5nIikNCmBgYA0KDQoNCioqKiANCkFmdGVyIGRpc2N1c3NpbmcgdGhlIGxlYXJuaW5nIG9iamVjdGl2ZXMsIGxvYWQgYWxsIHRoZSBwYWNrYWdlcyB1c2VkIGluIHRoZSBjYXNlIHN0dWR5IGFuYWx5c2lzIGluIHRoZSBjb2RlIGNodW5rIGJlbG93Og0KDQpXZSB3aWxsIGJlZ2luIGJ5IGxvYWRpbmcgdGhlIHBhY2thZ2VzIHRoYXQgd2Ugd2lsbCBuZWVkOg0KDQpgYGB7cn0NCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNCg0KUHJvdmlkZSBhIGxpbmsgdG8gdGhlIHNvdXJjZSBhbmQgYnJpZWZseSBleHBsYWluIGl0cyB1c2UgZm9yIGVhY2ggcGFja2FnZSBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOg0KDQogUGFja2FnZSAgIHwgVXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLQ0KW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9qZW5ueWJjL2hlcmVfaGVyZSl7dGFyZ2V0PSJfYmxhbmsifSAgICAgICB8IHRvIGVhc2lseSBsb2FkIGFuZCBzYXZlIGRhdGENCltyZWFkcl0oaHR0cHM6Ly9yZWFkci50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gaW1wb3J0IHRoZSBDU1YgZmlsZSBkYXRhDQoNCg0KVGhlIGZpcnN0IHRpbWUgd2UgdXNlIGEgZnVuY3Rpb24sIHdlIHdpbGwgdXNlIHRoZSBgOjpgIHRvIGluZGljYXRlIHdoaWNoIHBhY2thZ2Ugd2UgYXJlIHVzaW5nLiBVbmxlc3Mgd2UgaGF2ZSBvdmVybGFwcGluZyBmdW5jdGlvbiBuYW1lcywgdGhpcyBpcyBub3QgbmVjZXNzYXJ5LCBidXQgd2Ugd2lsbCBpbmNsdWRlIGl0IGhlcmUgdG8gYmUgaW5mb3JtYXRpdmUgYWJvdXQgd2hlcmUgdGhlIGZ1bmN0aW9ucyB3ZSB3aWxsIHVzZSBjb21lIGZyb20uDQoNCk5vdGU6IFVzaW5nIHRoZSBtZXRob2QgZGVzY3JpYmVkIGFib3ZlIGlzIHByZWZlcnJlZCwgYnV0IG5vdCBuZWNlc3NhcnkuIChhdm9jYWRvIGlzIHRoaXMgb2sgdG8gc2F5PykgDQoNCiMgKipDb250ZXh0KioNCioqKiANClByb3ZpZGUgc29tZSBtb3JlIGRldGFpbHMgYW5kIGJhY2tncm91bmQgb24gdGhlIGNhc2Ugc3R1ZHkgdG9waWMgYW5kIGl0cyByZWxhdGlvbiB0byBwdWJsaWMgaGVhbHRoL3RoZSB3b3JsZC4gDQoNCiMgKipMaW1pdGF0aW9ucyoqDQoqKiogDQpEZXNjcmliZSBhbnkgbGltaXRhdGlvbnMgdGhhdCBleGlzdCBpbiB0aGlzIGFuYWx5c2lzIHdoZXRoZXIgaXQgYmUgZHVlIHRvIHRoZSBkYXRhIGl0c2VsZiwgbWV0aG9kcyB1c2VkLCBuYXR1cmUgb2YgdGhlIHRvcGljLCBldGMuIA0KDQpUaGVyZSBhcmUgc29tZSBpbXBvcnRhbnQgY29uc2lkZXJhdGlvbnMgcmVnYXJkaW5nIHRoaXMgZGF0YSBhbmFseXNpcyB0byBrZWVwIGluIG1pbmQ6IA0KDQoxKSBMaW1pdGF0aW9uIDEgIA0KDQoyKSBMaW1pdGFpdG9uIDIgIA0KDQoNCiMgKipXaGF0IGFyZSB0aGUgZGF0YT8qKg0KKioqIA0KRGVzY3JpYmUgdGhlIGRhdGEgdG8gYmUgYW5hbHl6ZWQgYW5kIHdoZXJlIGl0IGNhbWUgZnJvbSBpbiB0aGlzIHNlY3Rpb24uDQoNCklmIHlvdSB3YW50IHRvIG1ha2UgYSB0YWJsZSBhYm91dCB2YXJpYWJsZSBpbmZvLCB1c2UgdGhlIGZvbGxvd2luZyB0YWJsZSB0ZW1wbGF0ZToNCg0KVmFyaWFibGUgICB8IERldGFpbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS0NCioqdmFyaWFibGUxKiogIHwgVmFyaWFibGUgaW5mbyAgPGJyPiAtLSBtb3JlIGRldGFpbHMgPGJyPiAtLSBtb3JlIGRldGlhbHMgPGJyPiAgKipFeGFtcGxlKio6IENvbnRlbnQgY29udGVudCAgDQoqKnZhcmlhYmxlMioqICB8IFZhcmlhYmxlIGluZm8gIDxicj4gLS0gbW9yZSBkZXRhaWxzIDxicj4gLS0gbW9yZSBkZXRpYWxzIDxicj4gICoqRXhhbXBsZSoqOiBDb250ZW50IGNvbnRlbnQNCg0KIyAqKkRhdGEgSW1wb3J0KioNCioqKiANCkRlc2NyaWJlIGhvdyB0byBpbXBvcnQgeW91ciBjYXNlIHN0dWR5IGRhdGEgZmlsZXMgaW50byBSOiAoYXZvY2FkbyBvciBweXRob24/KQ0KDQpXaXRoaW4geW91ciBjYXNlIHN0dWR5IHByb2plY3QgZm9sZGVyLCBwdXQgdGhlIGRhdGEgZmlsZXMgYXMgdGhleSBjYW1lIGZyb20gdGhlIHNvdXJjZSBpbnRvIGEgJ2RhdGEvcmF3Lycgc3ViZm9sZGVyIGFuZCB1c2UgdGhlIGBoZXJlYCBwYWNrYWdlLiBTZWUgdGhlIGZvbGxvd2luZyBleGFtcGxlOiANCg0KYGBge3J9DQpwbSA8LXJlYWRyOjpyZWFkX2NzdihoZXJlKCJkYXRhIiwgInJhdyIsICJwbTI1X2RhdGEuY3N2IikpDQpgYGANCg0KQXQgdGhlIGVuZCBvZiB0aGUgZGF0YSBpbXBvcnQgc2VjdGlvbiwgc2F2ZSB0aGUgaW1wb3J0ZWQgZGF0YSBhcyAucmRhIGZpbGVzIHRvIGFsbG93IHVzZXJzIHRvIHN0b3AgYW5kIHBpY2sgdXAgd2hlcmUgdGhleSBsZWZ0IG9mZjogDQoNCmBgYHtyfQ0Kc2F2ZShwbSwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGEiLCAiaW1wb3J0ZWQiLCAicG0yNV9kYXRhX2ltcG9ydGVkLnJkYSIpKQ0KYGBgDQoNCg0KIyAqKkRhdGEgRXhwbG9yYXRpb24gYW5kIFdyYW5nbGluZyoqDQoqKiogDQpBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToNCg0KSWYgeW91IGhhdmUgYmVlbiBmb2xsb3dpbmcgYWxvbmcgYnV0IHN0b3BwZWQsIHdlIGNvdWxkIGxvYWQgb3VyIGltcG9ydGVkIGRhdGEgbGlrZSBzbzoNCg0KYGBge3J9DQpsb2FkKGhlcmU6OmhlcmUoImRhdGEiLCAiaW1wb3J0ZWQiLCAicG0yNV9kYXRhX2ltcG9ydGVkLnJkYSIpKQ0KYGBgDQoNCkFsc28gcHJvdmlkZSBndWlkYW5jZSBmb3IgdXNlcnMgd2hvIG1heSBoYXZlIHNraXBwZWQgdGhlIHByZXZpb3VzIHNlY3Rpb24sIHNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGU6IA0KDQoqKioNCjxkZXRhaWxzPiA8c3VtbWFyeT4gSWYgeW91IHNraXBwZWQgdGhlIGRhdGEgaW1wb3J0IHNlY3Rpb24gY2xpY2sgaGVyZS4gPC9zdW1tYXJ5Pg0KDQpBbiBSREEgdmVyc2lvbiAoc3RhbmRzIGZvciBSIGRhdGEpIG9mIHRoZSBkYXRhIGNhbiBiZSBmb3VuZCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tLy9vcGVuY2FzZXN0dWRpZXMvb2NzLWJwLWNvMi1lbWlzc2lvbnMvdHJlZS9tYXN0ZXIvZGF0YS9pbXBvcnRlZCkgb3Igc2xpZ2h0bHkgbW9yZSBkaXJlY3RseSBbaGVyZV0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29wZW5jYXNlc3R1ZGllcy9vY3MtYnAtY28yLWVtaXNzaW9ucy9tYXN0ZXIvZGF0YS9pbXBvcnRlZC9jbzJfZGF0YV9pbXBvcnRlZC5yZGEpLiBEb3dubG9hZCB0aGlzIGZpbGUgYW5kIHRoZW4gcGxhY2UgaXQgaW4geW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHdpdGhpbiBhIHN1YmRpcmVjdG9yeSBjYWxsZWQgImltcG9ydGVkIiB3aXRoaW4gYSBkaXJlY3RvcnkgY2FsbGVkICJkYXRhIiB0byB1c2UgdGhlIGZvbGxvd2luZyBjb2RlLiBXZSB1c2VkIGFuIFJTdHVkaW8gcHJvamVjdCBhbmQgdGhlIFtgaGVyZWAgcGFja2FnZV0oaHR0cHM6Ly9naXRodWIuY29tL2plbm55YmMvaGVyZV9oZXJlKSB0byBuYXZpZ2F0ZSB0byB0aGUgZmlsZSBtb3JlIGVhc2lseS4NCg0KYGBge3IsIGV2YWw9RkFMU0V9DQpsb2FkKGhlcmU6OmhlcmUoImRhdGEiLCAiaW1wb3J0ZWQiLCAiY28yX2RhdGFfaW1wb3J0ZWQucmRhIikpDQpgYGANCg0KPC9kZXRhaWxzPg0KKioqDQoNClVzZSB0aGlzIHNlY3Rpb24gdG8gd2FsayB0aHJvdWdoIGFueSBleHBsb3JhdGlvbiBvZiB0aGUgZGF0YSBjb25kdWN0ZWQgcHJlLWFuYWx5c2lzLiBUaGVuLCBleHBsYWluIHN0ZXAtYnktc3RlcCB0aGUgZGF0YSB3cmFuZ2xpbmcgcHJvY2VzcyB1c2VkIHRvIHByZXBhcmUgdGhlIGRhdGEgZm9yIGFuYWx5c2lzLiBOb3RlIHRoYXQgbm90IGFsbCBjYXNlIHN0dWRpZXMgaW5jbHVkZSBhIGRhdGEgZXhwbG9yYXRpb24uIERhdGEgZXhwbG9yYXRpb24gYW5kIHdyYW5nbGluZyBtYXkgYWxzbyBiZSBzcGxpdCBpbnRvIHR3byBzZWN0aW9ucy4gDQoNCldlIHdpbGwgYWxzbyB1c2UgdGhlIGAlPiVgIHBpcGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBpbnB1dCBmb3IgbGF0ZXIgc2VxdWVudGlhbCBzdGVwcy4gVGhpcyB3aWxsIG1ha2UgbW9yZSBzZW5zZSB3aGVuIHdlIGhhdmUgbXVsdGlwbGUgc2VxdWVudGlhbCBzdGVwcyB1c2luZyB0aGUgc2FtZSBkYXRhIG9iamVjdC4gVG8gdXNlIHRoZSBwaXBlIG5vdGF0aW9uIHdlIG5lZWQgdG8gaW5zdGFsbCBhbmQgbG9hZCBkcGx5ciBhcyB3ZWxsLg0KKGF2b2NhZG8gZG8gd2Ugd2FudCB0byBrZWVwIHRoaXMgbGluZSBhYm92ZSBpbiB0aGUgdGVtcGxhdGU/KQ0KDQpDYW4gaW5jbHVkZSBEVCB0YWJsZXMgdG9vOiANCg0KYGBge3J9DQpsaWJyYXJ5KERUKQ0KRFQ6OmRhdGF0YWJsZShpcmlzKQ0KYGBgDQoNCihub3RlIHRoYXQgeW91IGNhbmB0IHVzZSB0aGVzZSBpbnNpZGUgYSBjbGljayBleHBhbmQgZGV0YWlscyBzZWN0aW9uLikNCg0KU2Nyb2xsYWJsZSBjb250ZW50Og0KDQojIyMjIHsuc2Nyb2xsYWJsZSB9DQpgYGB7cn0NCiMgU2Nyb2xsIHRocm91Z2ggdGhlIG91dHB1dCENCnBtICU+JSANCiAgZGlzdGluY3Qoc3RhdGUpICU+JQ0KICBwcmludChuID0gMWUzKQ0KYGBgDQojIyMjDQoNCg0KVG8gbWFrZSBjbGljayBleHBhbmQgc2VjdGlvbiB1c2U6DQoNCjxkZXRhaWxzPjxzdW1tYXJ5PiBDbGljayBoZXJlIHRvIHNlZSBtb3JlIGluZm8gPC9zdW1tYXJ5Pg0KDQp0ZXh0IHRleHQNCg0KPC9kZXRhaWxzPg0KDQpOb3RlISEhIFlvdSBjYW5ub3QgdXNlIHNjcm9sbCBmZWF0dXJlcyBpbnNpZGUgZGV0YWlsIHNlY3Rpb25zIHVubGVzcyBpdCBpcyB0aGUgbGFzdCBoZWFkZXIgc2VjdGlvbiEgT3RoZXJ3aXNlIGl0IHdpbGwgY2F1c2UgdGhlIG90aGVyIGhlYWRlcnMgdG8gYmUgbWlzc2luZyBhbmQgb3RoZXIgaXNzdWVzLiANCg0KWW91IGNhbiBzdGlsbCBkbyB0aGlzIGlmIHlvdSBsZWF2ZSBhbiBvcGVuIGRldGFpbHMgc2VjdGlvbiBsaWtlIHRoaXMgYW5kIHRoZW4gaGF2ZSBhIHNlY3Rpb24gaGVhZGVyIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoaXMgc2VjdGlvbjoNCg0KPGRldGFpbHM+PHN1bW1hcnk+IENsaWNrIGhlcmUgdG8gc2VlIG1vcmUgaW5mbyA8L3N1bW1hcnk+DQoNCnRleHQgdGV4dA0KDQpTY3JvbGxhYmxlIGNvbnRlbnQ6DQoNCiMjIyMgey5zY3JvbGxhYmxlIH0NCmBgYHtyfQ0KIyBTY3JvbGwgdGhyb3VnaCB0aGUgb3V0cHV0IQ0KcG0gJT4lIA0KICBkaXN0aW5jdChzdGF0ZSkgJT4lDQogIHByaW50KG4gPSAxZTMpDQpgYGANCiMjIyMNCg0KQXQgdGhlIGVuZCBvZiB0aGlzIHNlY3Rpb24sIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoNCg0KVG8gYWxsb3cgdXNlcnMgdG8gc2tpcCBpbXBvcnQgYW5kIHdyYW5nbGluZyB3ZSB3aWxsIHNhdmUgdGhlIGRhdGEgYXMgYW4gUkRBIGZpbGUgYXMgd2VsbCBhcyBhIENTViBmaWxlIGFzIHRoaXMgaXMgb2Z0ZW4gdXNlZnVsIHRvIHNlbmQgb3VyIGRhdGEgdG8gY29sbGFib3JhdG9ycy4gV2Ugd2lsbCBzYXZlIHRoaXMgaW4gYSDigJx3cmFuZ2xlZOKAnSBzdWJkaXJlY3Rvcnkgb2Ygb3VyIOKAnGRhdGHigJ0gZGlyZWN0b3J5IG9mIG91ciB3b3JraW5nIGRpcmVjdG9yeS4NCg0KYGBge3J9DQpzYXZlKHBtLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YSIsICJ3cmFuZ2xlZCIsICJ3cmFuZ2xlZF9kYXRhLnJkYSIpKSANCnJlYWRyOjp3cml0ZV9jc3YocG0sIHBhdGggPSBoZXJlOjpoZXJlKCJkYXRhIiwid3JhbmdsZWQiLCAid3JhbmdsZWRfZGF0YS5jc3YiKSkNCmBgYA0KDQpSZXBsYWNlIGBwbWAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZGF0YSBvYmplY3QgY3JlYXRlZCBhdCB0aGUgZW5kIG9mIGRhdGEgd3JhbmdsaW5nLiANCg0KIyAqKkRhdGEgVmlzdWFsaXphdGlvbioqDQoqKiogDQpBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToNCg0KSWYgeW91IGhhdmUgYmVlbiBmb2xsb3dpbmcgYWxvbmcgYnV0IHN0b3BwZWQsIHdlIGNvdWxkIGxvYWQgb3VyIHdyYW5nbGVkIGRhdGEgbGlrZSBzbzoNCg0KYGBge3J9DQpsb2FkKGhlcmU6OmhlcmUoImRhdGEiLCAid3JhbmdsZWQiLCAid3JhbmdsZWRfZGF0YS5yZGEiKSkNCmBgYA0KDQpBbHNvIHByb3ZpZGUgZ3VpZGFuY2UgZm9yIHVzZXJzIHdobyBtYXkgaGF2ZSBza2lwcGVkIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBzZWUgdGhlIGZvbGxvd2luZyBleGFtcGxlOiANCg0KKioqDQo8ZGV0YWlscz4gPHN1bW1hcnk+IElmIHlvdSBza2lwcGVkIHRoZSBkYXRhIGltcG9ydCBzZWN0aW9uIGNsaWNrIGhlcmUuIDwvc3VtbWFyeT4NCg0KQW4gUkRBIGZpbGUgKHN0YW5kcyBmb3IgUiBkYXRhKSBvZiB0aGUgZGF0YSBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS8vb3BlbmNhc2VzdHVkaWVzL29jcy1icC1jbzItZW1pc3Npb25zL3RyZWUvbWFzdGVyL2RhdGEvd3JhbmdsZWQpIG9yIHNsaWdodGx5IG1vcmUgZGlyZWN0bHkgW2hlcmVdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vcGVuY2FzZXN0dWRpZXMvb2NzLWJwLWNvMi1lbWlzc2lvbnMvbWFzdGVyL2RhdGEvd3JhbmdsZWQvd3JhbmdsZWRfZGF0YS5yZGEpLiBEb3dubG9hZCB0aGlzIGZpbGUgYW5kIHRoZW4gcGxhY2UgaXQgaW4geW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHdpdGhpbiBhIHN1YmRpcmVjdG9yeSBjYWxsZWQgIndyYW5nbGVkIiB3aXRoaW4gYSBzdWJkaXJlY3RvcnkgY2FsbGVkICJkYXRhIiB0byB1c2UgdGhlIGZvbGxvd2luZyBjb2RlLiBXZSB1c2VkIGFuIFJTdHVkaW8gcHJvamVjdCBhbmQgdGhlIFtgaGVyZWAgcGFja2FnZV0oaHR0cHM6Ly9naXRodWIuY29tL2plbm55YmMvaGVyZV9oZXJlKSB0byBuYXZpZ2F0ZSB0byB0aGUgZmlsZSBtb3JlIGVhc2lseS4NCg0KDQpgYGB7cn0NCmxvYWQoaGVyZTo6aGVyZSgiZGF0YSIsICJ3cmFuZ2xlZCIsICJ3cmFuZ2xlZF9kYXRhLnJkYSIpKQ0KYGBgDQoNCjwvZGV0YWlscz4NCioqKg0KDQpVc2UgdGhpcyBzZWN0aW9uIHRvIHdhbGsgdGhyb3VnaCBzdGVwIGJ5IHN0ZXAgaG93IHRoZSB3cmFuZ2xlZCBkYXRhIHdhcyB2aXN1YWxpemVkLiBFeHBsYWluIGhvdyB0aGVzZSB2aXN1YWxpemF0aW9ucyBpbXByb3ZlIHVuZGVyc3RhbmRpbmcgYW5kIGhlbHAgZXh0cmFjdCBpbnNpZ2h0cy4gDQoNCklmIGFueSBmdXJ0aGVyIHdyYW5nbGluZyB3YXMgY29uZHVjdGVkIGluIHRoaXMgc2VjdGlvbiwgcGxlYXNlIHNhdmUgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgdGhlIGRhdGEgc2ltaWxhciB0byBwcmV2aW91cyBzZWN0aW9ucy4gDQoNCiMgKipEYXRhIEFuYWx5c2lzKioNCioqKiANCkF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24sIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBtZXNzYWdlOg0KDQpJZiB5b3UgaGF2ZSBiZWVuIGZvbGxvd2luZyBhbG9uZyBidXQgc3RvcHBlZCwgd2UgY291bGQgbG9hZCBvdXIgd3JhbmdsZWQgZGF0YSBsaWtlIHNvOg0KDQpgYGB7cn0NCmxvYWQoaGVyZTo6aGVyZSgiZGF0YSIsICJ3cmFuZ2xlZCIsICJ3cmFuZ2xlZF9kYXRhLnJkYSIpKQ0KYGBgDQoNCkFsc28gcHJvdmlkZSBndWlkYW5jZSBmb3IgdXNlcnMgd2hvIG1heSBoYXZlIHNraXBwZWQgdGhlIHByZXZpb3VzIHNlY3Rpb24sIHNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGU6IA0KDQoqKioNCjxkZXRhaWxzPiA8c3VtbWFyeT4gSWYgeW91IHNraXBwZWQgdGhlIGRhdGEgaW1wb3J0IHNlY3Rpb24gY2xpY2sgaGVyZS4gPC9zdW1tYXJ5Pg0KDQpBbiBSREEgZmlsZSAoc3RhbmRzIGZvciBSIGRhdGEpIG9mIHRoZSBkYXRhIGNhbiBiZSBmb3VuZCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tLy9vcGVuY2FzZXN0dWRpZXMvb2NzLWJwLWNvMi1lbWlzc2lvbnMvdHJlZS9tYXN0ZXIvZGF0YS93cmFuZ2xlZCkgb3Igc2xpZ2h0bHkgbW9yZSBkaXJlY3RseSBbaGVyZV0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29wZW5jYXNlc3R1ZGllcy9vY3MtYnAtY28yLWVtaXNzaW9ucy9tYXN0ZXIvZGF0YS93cmFuZ2xlZC93cmFuZ2xlZF9kYXRhLnJkYSkuIERvd25sb2FkIHRoaXMgZmlsZSBhbmQgdGhlbiBwbGFjZSBpdCBpbiB5b3VyIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgd2l0aGluIGEgc3ViZGlyZWN0b3J5IGNhbGxlZCAid3JhbmdsZWQiIHdpdGhpbiBhIHN1YmRpcmVjdG9yeSBjYWxsZWQgImRhdGEiIHRvIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUuIFdlIHVzZWQgYW4gUlN0dWRpbyBwcm9qZWN0IGFuZCB0aGUgW2BoZXJlYCBwYWNrYWdlXShodHRwczovL2dpdGh1Yi5jb20vamVubnliYy9oZXJlX2hlcmUpIHRvIG5hdmlnYXRlIHRvIHRoZSBmaWxlIG1vcmUgZWFzaWx5Lg0KDQoNCmBgYHtyfQ0KbG9hZChoZXJlOjpoZXJlKCJkYXRhIiwgIndyYW5nbGVkIiwgIndyYW5nbGVkX2RhdGEucmRhIikpDQpgYGANCg0KPC9kZXRhaWxzPg0KKioqDQoNClVzZSB0aGlzIHNlY3Rpb24gdG8gd2FsayB0aHJvdWdoIHRoZSBtZXRob2RzIGFuZCBjb2RlIHVzZWQgaW4gdGhlIGRhdGEgYW5hbHlzaXMgc3RlcC1ieS1zdGVwLiBFeHBsYWluIGhvdyB0aGlzIGFuYWx5c2lzIGhlbHBzIGFuc3dlciB0aGUgbWFpbiBxdWVzdGlvbnMgcG9zZWQgZWFybGllciBpbiB0aGUgY2FzZSBzdHVkeS4gDQoNCiMjICoqY29udGVudCBoZWFkZXIqKg0KKioqIA0KIyMjICoqY29udGVudCBoZWFkZXIgYWRkaXRpb25hbCBsZXZlbCoqDQoqKioNCg0KDQojICoqU3VtbWFyeSoqDQoqKiogDQojIyAqKlN5bm9wc2lzKioNCioqKg0KQnJpZWZseSByZWNhcCBldmVyeXRoaW5nIHRoYXQgd2FzIGNvdmVyZWQgaW4gdGhlIGNhc2Ugc3R1ZHkgZnJvbSB0aGUgbW90aXZhdGlvbiB0byBkYXRhIGFuYWx5c2lzLiBIaWdobGlnaHQgdGhlIGNvbmNsdXNpb25zIG1hZGUgYW5kIHN1Z2dlc3QgYW55IGxpbWl0YXRpb25zIG9yIGZ1dHVyZSB3b3JrIHRvIGJlIGRvbmUuDQoNCiMjICoqU3VtbWFyeSBQbG90KioNCioqKg0KQ29uc3RydWN0IGEgcGxvdCBoZXJlIHRoYXQgc3VtbWFyaXplcyB0aGUgY29uY2x1c2lvbnMgZm91bmQgaW4gdGhlIGRhdGEsIGlmIGFwcGxpY2FibGUuIA0KDQojICoqU3VnZ2VzdGVkIEhvbWV3b3JrKioNCioqKiANClN1Z2dlc3QgZXh0cmEgZXhlcmNpc2VzIHVzaW5nIHRoaXMgZGF0YSBmb3Igc3R1ZGVudHMgdG8gcHJhY3RpY2UgdGhlIHNraWxscyB1c2VkIGluIHRoZSBjYXNlIHN0dWR5LiANCg0KRXhhbXBsZXMgZnJvbSBbQ08yIGNhc2Ugc3R1ZHldKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuY2FzZXN0dWRpZXMvb2NzLWJwLWNvMi1lbWlzc2lvbnMvKTogDQoNCkFzayBzdHVkZW50cyB0byBjcmVhdGUgYSBwbG90IHdpdGggbGFiZWxzIHNob3dpbmcgdGhlIGNvdW50cmllcyB3aXRoIHRoZSBsb3dlc3QgQ08yIGVtaXNzaW9uIGxldmVscy4NCg0KQXNrIHN0dWRlbnRzIHRvIHBsb3QgQ08yIGVtaXNzaW9ucyBhbmQgb3RoZXIgdmFyaWFibGVzIChlLmcuIGVuZXJneSB1c2UpIG9uIGEgc2NhdHRlciBwbG90LCBjYWxjdWxhdGUgdGhlIFBlYXJzb24ncyBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCwgYW5kIGRpc2N1c3MgcmVzdWx0cy4gDQoNCiMgKipBZGRpdGlvbmFsIEluZm9ybWF0aW9uKioNCioqKg0KVXNlIHRoaXMgc2VjdGlvbiB0byBwcm92aWRlIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIHJlc291cmNlcyBvbiB0aGUgdG9waWNzIGFuZCBtZXRob2RzIGNvdmVyZWQgaW4gdGhlIGNhc2Ugc3R1ZHkuIA0KDQojIyAqKkhlbHBmdWwgTGlua3MqKg0KKioqIA0KDQpyZXZpZXcgb2YgW3RpZHltb2RlbHNdKGh0dHBzOi8vcnZpZXdzLnJzdHVkaW8uY29tLzIwMTkvMDYvMTkvYS1nZW50bGUtaW50cm8tdG8tdGlkeW1vZGVscy8pe3RhcmdldD0iX2JsYW5rIn0gDQoNCmd1aWRlIGZvciBbcHJlcHJvY2Vzc2luZyB3aXRoIHJlY2lwZXNdKGh0dHA6Ly93d3cucmViZWNjYWJhcnRlci5jb20vYmxvZy8yMDE5LTA2LTA2X3ByZV9wcm9jZXNzaW5nLykNCg0KW2d1aWRlXShodHRwczovL2JyaWF0dGUuZ2l0aHViLmlvL2dnY29yci8pIGZvciB1c2luZyBHR2FsbHkgdG8gY3JlYXRlIGNvcnJlbGF0aW9uIHBsb3RzDQpbZ3VpZGVdKGh0dHBzOi8vd3d3LnRpZHl2ZXJzZS5vcmcvYmxvZy8yMDE4LzExL3BhcnNuaXAtMC0wLTEvKSBmb3IgdXNpbmcgcGFyc25pcCB0byB0cnkgZGlmZmVyZW50IGFsZ29yaXRobXMgb3IgZW5naW5lcw0KW3JlY2lwZSBmdW5jdGlvbnNdKGh0dHBzOi8vdGlkeW1vZGVscy5naXRodWIuaW8vcmVjaXBlcy9yZWZlcmVuY2UvaW5kZXguaHRtbCkNCg0KPHU+VGVybXMgYW5kIGNvbmNlcHRzIGNvdmVyZWQ6PC91PiAgDQoNCltUaWR5dmVyc2VdKGh0dHBzOi8vd3d3LnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICANCltSU3R1ZGlvIGNoZWF0c2hlZXRzXShodHRwczovL3JzdHVkaW8uY29tL3Jlc291cmNlcy9jaGVhdHNoZWV0cy8pe3RhcmdldD0iX2JsYW5rIn0gIA0KW0luZmVyZW5jZV0oaHR0cHM6Ly93d3cuYnJpdGFubmljYS5jb20vc2NpZW5jZS9pbmZlcmVuY2Utc3RhdGlzdGljcyl7dGFyZ2V0PSJfYmxhbmsifSAgDQpbUmVncmVzc2lvbl0oaHR0cHM6Ly9saW5kZWxvZXYuZ2l0aHViLmlvL3Rlc3RzLWFzLWxpbmVhci8pe3RhcmdldD0iX2JsYW5rIn0gIA0KW0RpZmZlcmVudCB0eXBlcyBvZiByZWdyZXNzaW9uXShodHRwczovL3d3dy5hbmFseXRpY3N2aWRoeWEuY29tL2Jsb2cvMjAxNS8wOC9jb21wcmVoZW5zaXZlLWd1aWRlLXJlZ3Jlc3Npb24vKXt0YXJnZXQ9Il9ibGFuayJ9ICANCltPcmRpbmFyeSBsZWFzdCBzcXVhcmVzIG1ldGhvZF0oaHR0cDovL3NldG9zYS5pby9ldi9vcmRpbmFyeS1sZWFzdC1zcXVhcmVzLXJlZ3Jlc3Npb24vKXt0YXJnZXQ9Il9ibGFuayJ9ICANCltSZXNpZHVhbF0oaHR0cHM6Ly93d3cuc3RhdGlzdGljc2hvd3RvLmRhdGFzY2llbmNlY2VudHJhbC5jb20vcmVzaWR1YWwvKXt0YXJnZXQ9Il9ibGFuayJ9ICANCg0KPHU+UGFja2FnZXMgdXNlZCBpbiB0aGlzIGNhc2Ugc3R1ZHk6IDwvdT4NCg0KIFBhY2thZ2UgICB8IFVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS0NCltoZXJlXShodHRwczovL2dpdGh1Yi5jb20vamVubnliYy9oZXJlX2hlcmUpe3RhcmdldD0iX2JsYW5rIn0gICAgICAgfCB0byBlYXNpbHkgbG9hZCBhbmQgc2F2ZSBkYXRhICANCltyZWFkcl0oaHR0cHM6Ly9yZWFkci50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gaW1wb3J0IHRoZSBDU1YgZmlsZSBkYXRhICANCltkcGx5cl0oaHR0cHM6Ly9kcGx5ci50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gYXJyYW5nZS9maWx0ZXIvc2VsZWN0L2NvbXBhcmUgc3BlY2lmaWMgc3Vic2V0cyBvZiB0aGUgZGF0YSAgDQpbc2tpbXJdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9za2ltci9pbmRleC5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byBnZXQgYW4gb3ZlcnZpZXcgb2YgZGF0YSAgIA0KW3N1bW1hcnl0b29sc10oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3NraW1yL2luZGV4Lmh0bWwpe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIGdldCBhbiBvdmVydmlldyBvZiBkYXRhIGluIGEgZGlmZmVyZW50IHN0eWxlICAgDQpbcGRmdG9vbHNdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9wZGZ0b29scy9wZGZ0b29scy5wZGYpe3RhcmdldD0iX2JsYW5rIn0gICB8IHRvIHJlYWQgYSBQREYgaW50byBSICAgDQpbbWFncml0dHJdKGh0dHBzOi8vbWFncml0dHIudGlkeXZlcnNlLm9yZy9hcnRpY2xlcy9tYWdyaXR0ci5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9ICAgfCB0byB1c2UgdGhlIGAlPD4lYCBwaXBwaW5nIG9wZXJhdG9yICANCltwdXJycl0oaHR0cHM6Ly9wdXJyci50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gcGVyZm9ybSBmdW5jdGlvbnMgb24gYWxsIGNvbHVtbnMgb2YgYSB0aWJibGUgICANClt0aWJibGVdKGh0dHBzOi8vdGliYmxlLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICB8IHRvIGNyZWF0ZSBkYXRhIG9iamVjdHMgdGhhdCB3ZSBjYW4gbWFuaXB1bGF0ZSB3aXRoICBkcGx5ci9zdHJpbmdyL3RpZHlyL3B1cnJyICANClt0aWR5cl0oaHR0cHM6Ly90aWR5ci50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gc2VwYXJhdGUgZGF0YSB3aXRoaW4gYSBjb2x1bW4gaW50byBtdWx0aXBsZSBjb2x1bW5zIA0KW2dncGxvdDJdKGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICB8IHRvIG1ha2UgdmlzdWFsaXphdGlvbnMgd2l0aCBtdWx0aXBsZSBsYXllcnMgIA0KDQojIyAqKlNlc3Npb24gSW5mbyoqDQoqKioNCg0KYGBge3J9DQpkZXZ0b29sczo6c2Vzc2lvbl9pbmZvKCkNCmBgYA0KDQojIyAqKkFja25vd2xlZGdtZW50cyoqDQoqKioNCg==